// 站点信息
let siteInfo = require('./siteinfo.js');
// 第三方配置信息
let setinfo = Object.assign({}, siteInfo, wx.getExtConfigSync ? wx.getExtConfigSync() : {});
// 测试 request 
let test = require('./utils/test.js');
//  测试请求 - 
let wx_request = test({
  base_url: setinfo.api,
  tomeout: 0,
  header: {},
  statusCode: [200, 400]
})
let that;
//  请求拦截 
wx_request.RequestIntereptor.use(async (config, ...args) => {
  console.log('before')
  // 遍历出  当前页面实例 app_confings
  let app_confings = args.length && args.filter((el, index) => { if (el.data && el.__route__) return el; })[0];
  // console.log(app_confings);
  //  projectId
  //  开启进度noProgress - loding
  //  请求之前 ,可以做一些事儿;
  console.debug('--------------------------开启进度条--------------------%');
  /**
   * is_loding  加载动画 执行 
   * carry_isloding 是否是第一次执行 
   */
  let carry_isloding = (status) => {
    app_confings.setData({
      is_loding: status
    })
  }
  app_confings && carry_isloding(app_confings.data.carry_isloding)
  config = {
    header: {
      'x-custom-header': 'x-custom-header'
    },
    body: Object.assign({}, config.body, {
      token: wx.getStorageSync('Account').token,
      projectId: setinfo.project_id
    })
  };
  return config;
});
//  相应拦截
wx_request.ResponseIntereptor.use(async (response, ...args) => { // 响应拦截器（可以设置多个, 同时可以也可以使用异步方法）
  console.log('end')
  const {
    data: res
  } = response // args[0] method args[1] url args[3] data
  await new Promise(resolve => setTimeout(() => resolve(), 200));

  let app_confings = args.length && args.filter((el, index) => { if (el.data && el.__route__) return el; })[0];

  app_confings && app_confings.setData({
    is_loding: false,
    carry_isloding: false
  })
  // console.log('关闭进度条');
  /**
   * 可以操作数据 
   *   //  await new Promise(resolve => setTimeout(() => resolve(), 3000))
   */
  if (res.code === 200) console.debug('%------------ 响应拦截器， 会阻塞 3 s -------%');
  //  数据返回
  //  test ----------------------测试
  return response;
});

App({
  //  第三方配置 
  siteInfo: setinfo,
  // 全局变量 
  globalData: {
    seteInfo_https: siteInfo.api,    // 请求的api 地址 
    project_id: siteInfo.project_id,  // porject 
    api: siteInfo.api,
    version: false,  //版本号 
    update: false,  // 是否更新
    isConnected: true,   // 是否网络连接 
    userInfo: false,  // 用户信息 
    statusBarHeight: 0,
    navHeight: 0,
    btnHeight: 0,
    navTop: 0,
    windowHeight: 0,
    windowWidth: 0,
    tabbarHeight: 50,
    TOP_DISTANCE: 0,
    BOTTOM_DISTANCE: 0, // 底部 小白条的高度 
    accountStatus: 0, // 存储全局的登录状态，
    //  底部 tabbar
    tabbar_items: [{
      "pagePath": "pages/nav/01/index",
      "text": "首页",
      "iconPath": "//boss.ahwnwl.com/_upload/3a3fjGY6GQCktC3Kj3MYk7Y3wYJbeYx3.png",
      "selectedIconPath": "//boss.ahwnwl.com/_upload/yhEGSbydBfb4h8trJKCJCbGDYaN5e4sQ.png",
      "auth": 0
    },
    {
      "pagePath": "pages/nav/02/index",
      "text": "权限",
      "iconPath": "//boss.ahwnwl.com/_upload/3a3fjGY6GQCktC3Kj3MYk7Y3wYJbeYx3.png",
      "selectedIconPath": "//boss.ahwnwl.com/_upload/yhEGSbydBfb4h8trJKCJCbGDYaN5e4sQ.png",
      "auth": 0
    },
    {
      "pagePath": "pages/nav/03/index",
      "text": "消息",
      "iconPath": "//boss.ahwnwl.com/_upload/3a3fjGY6GQCktC3Kj3MYk7Y3wYJbeYx3.png",
      "selectedIconPath": "//boss.ahwnwl.com/_upload/yhEGSbydBfb4h8trJKCJCbGDYaN5e4sQ.png",
      "auth": 0
    },
    {
      "pagePath": "pages/nav/04/index",
      "text": "消息",
      "iconPath": "//boss.ahwnwl.com/_upload/3a3fjGY6GQCktC3Kj3MYk7Y3wYJbeYx3.png",
      "selectedIconPath": "//boss.ahwnwl.com/_upload/yhEGSbydBfb4h8trJKCJCbGDYaN5e4sQ.png",
      "auth": 0
    }
    ],
    //  tabbar  配置 
    tabbar_config: {
      color: 'red'
    },
    //  头部navbar
    navbar_items: [

    ],
    //  登录状态 
    accountStatus: 0,
    //  登录头像 default 默认
  },
  //初始化
  onLaunch: function (options) {
    wx.setStorageSync('scene', options.scene);
    let App = this;
    // 监听路由变化
    wx.onAppRoute(function (res) {
      //监听网络状态
      App.setNetworkStatus();
      let promiseArr = [];
      //  that 获取当前页面实例对象 
      that = App.getPage();
      //验证版本号
      let __path = res.path;
      if (__path !== 'pages/start/index/index' && __path !== 'pages/wait/connect/index') {
        //实时更新版本
        //  推入执行队列
        promiseArr.push(new Promise((reslove, reject) => {
          App.checkVersion(reslove);
        }))
        // 页面数据 
        promiseArr.push(new Promise((reslove, reject) => {
          // console.log('页面数据')
          App.setPageConfig(reslove)
        }))
        //  执行 promiseArr 
        Promise.all(promiseArr).then(() => {
          // console.log('执行end')
        })
      }
      //  
    });
    //  获取设备信息 
    App.DeviceInfo();
    //  隐私状态
    App.getPrivacySetting();
    //  授权信息
    App.getSetting();
  },
  // 页面切换 
  onShow: function () {
  },
  //网络状态  wifi  5g none
  statusNetwork() {
    let App = this;
    wx.getNetworkType({
      success(res) {
        const networkType = res.networkType;
        if (networkType === 'none') {
          App.globalData.isConnected = false
          wx.showToast({
            title: '当前无网络',
            icon: 'loading',
            duration: 2000,
            complete: function () {
              App.goWaitConnectPageTimeOut();
            }
          })
        } else {
          App.globalData.isConnected = true;
        }
      }
    })
  },
  //  设置监听网络动作 
  setNetworkStatus() {
    let App = this;
    /**
     * App.statusNetWork { Function }    使用网络-状态  none wifi 5g
     * isConnecte { Boolean } true | false
     */
    App.statusNetwork();
    /**
     * wx.onNetworkStatusChange {  Function } 网络状态变化事件的监听函数
     * 
     */
    wx.onNetworkStatusChange(function (res) {
      if (!res.isConnected) {
        App.globalData.isConnected = res.isConnected;
        wx.showToast({
          title: '网络已断开',
          icon: 'loading',
          duration: 2000,
          complete: function () {
            //  网络等待页面
            App.goWaitConnectPageTimeOut()
          }
        })
      } else {
        App.globalData.isConnected = true
        // 隐藏弹窗
        wx.hideToast()
      }
    })
  },
  //  等待网络页面 
  goWaitConnectPageTimeOut: function () {
    if (App.globalData.navigateToWaitConnect) {
      return;
    }
    App.globalData.navigateToWaitConnect = true;
    setTimeout(function () {
      wx.navigateTo({
        url: "/pages/wait/connect/index",
        fail: () => {
          App.globalData.navigateToWaitConnect = false;
        }
      })
    }, 500)
  },
  //回到主页
  goSwitchIndexPage: function () {
    let App = this;
    wx.switchTab({
      url: "/pages/nav/01/index",
      fail: function () {
        App.goStartPage();
      }
    })
  },
  //回 main
  goMainPage: function () {
    let App = this;
    wx.navigateTo({
      url: "/pages/main/index",
      fail: function () {
        App.goSwitchIndexPage();
      }
    })
  },
  //回 start
  goStartPage: function () {
    let App = this;
    // console.log('执行了嘛')
    wx.reLaunch({
      url: "/pages/start/index/index",
      fail: function () {
        App.goMainPage();
      }
    })
  },
  //  
  //获取当前页面路径
  getPage() {
    //  获取当前页面栈。数组中第一个元素为首页，最后一个元素为当前页面
    let pages = getCurrentPages();
    let currentPage = false;
    if (pages.length) {
      currentPage = pages[pages.length - 1];
    }
    return currentPage;
  },
  //  设置当前页面配置
  setPageConfig() {
    let App = this;
    // console.log('当前页面配置')
    const get_PageConfig = async () => {
      const result = await App.getPageConfig();
      // console.log('navBar', '获取的navBar的信息', result)
      // 通过实例 进行页面实例 修改navbar 
      if (result) {
        // console.log('修改全局变量', result)
        App.setBaseData(result)
      }
    }
    // 获取navbar 的信息 
    get_PageConfig()
  },
  // 设置全局通用变量
  setBaseData(data, call) {
    let App = this;
    // owner 当前页面实例对象
    let owner = App.getPage();
    //  当前组件实例对象 data Object.assign合并
    let new_data = Object.assign(owner.data || {}, data ? data : {})
    if (owner) {
      owner.setData(new_data)
    }
    // console.log(owner.data)
  },
  //  获取系统配置
  getBase() {
    let App = this,
      base;
    return new Promise((resolve, reject) => {
      /**
       * 1 读取缓存 是否 有配置信息 
       */
      let App = this,
        base;
      wx.getStorageSync('base');
      if (base = wx.getStorageSync('base')) {
        ("%c \n\n-------------------- tabbar 读取缓存  ----------------", "color:green");
        //  读取缓存有没有
        resolve(base)
      } else {
        const data = {
          projectId: App.globalData.project_id,
        }
        wx_request.post('/open/wx_app_api/getBase', data, false, {
          header: ''
        }, true, true).then(res => {
          console.log(res, '最后的数据')
          resolve(res)
        })

      }
    })
  },
  //  获取当前页面配置 
  getPageConfig() {
    let App = this,
      page;
    //  获取当前页面配置
    return new Promise((reslove, reject) => {
      //   page = 当前页面信息
      /**
       *@param page_URL  `String`
       *@param project_id   `String`
       @param name  `String`
       */
      // if (page = App.getPage()) {
      //   const data = {
      //     path: page.route,
      //     name: '',
      //     project_Id: App.globalData.project_id,
      //     config: null
      //   }
      //   // console.log(data, '需要的参数')
      //   // 读取缓存 中的数据 
      //   // console.log(wx.getStorageSync(data.path), "读取的数据")
      //   if (data.config = wx.getStorageSync(data.path)) {
      //     /**
      //      * true or false
      //      */
      //     reslove(data.config)
      //   } else {
      //     // 请求当前数据 
      //     //  url `String` 请求路劲
      //     const url = '/open/wx_app_api/getNavBar';
      //     const s_f = (res) => {
      //       // console.log(res, '当前页面数据')

      //       if (res.data.code === 200) {
      //         //  进行缓存 
      //         wx.setStorage({
      //           data: res?.data?.data,
      //           key: data.path,
      //           success: function () {
      //             //  区分常规缓存 or 用户缓存
      //             App.systemStore(data?.path)
      //           }
      //         })
      //         console.log(res.data, 'res.data')
      //         reslove(res?.data?.data)
      //       }
      //     }
      //     App._post(url, data, s_f)
      //   }
      // }
      reslove(true)
    })
  },
  //系统缓存分类 c：常规 a：用户信息
  systemStore(key, type = 'c') {
    let config = wx.getStorageSync(type) || {};
    //  存储格式new Map 数据结构  ? 
    config[key] = 1;
    wx.setStorage({
      key: type,
      data: config,
    });
  },
  //  test 测试请求
  test(config) {
    return wx_request;
  },
  //获取版本号
  getVersion(cache = 60) {
    let App = this;
    const data = {
      project_Id: App.globalData.project_id
    }
    return new Promise((reslove, reject) => {
      //  版本号
      // 测试  请求 
      wx_request.post('/open/wx_app_api/getVersion', data, false, {
      }, true, true).then(res => {
        let version = res.data.version;
        // console.log(version);
        reslove(version)
      })
    })
  },
  //验证版本号
  checkVersion(cache = 60) {
    // console.log('验证版本信息')
    let App = this;

    const reload = async (result) => {
      // console.log('执行版本更新')
      //  提示  

      wx.showLoading({
        title: '正在更新系统...',
        mask: true
      })
      //  清除系统配置 
      // console.log('清除系统配置')
      const res = await App.clearSystemStore();

      setTimeout(() => {
        //  存储新的版本号
        wx.setStorage({
          data: result,
          key: '_version'
        })
        // hideLoading
        wx.hideLoading();
        //  
        //  跳转start  重新执行
        App.goStartPage()
        // console.log('版本更新重新执行start', 123)

      }, 5000)
    }
    const get_Version = async () => {

      try {
        //  获取version 版本信息 
        const result = await App.getVersion();
        // console.log(result, 123123)
        // 
        //  存储版本信息 
        if (result) {

          let _version = wx.getStorageSync('_version');
          // console.log(_version, result, '此时的版本信息 ')
          // console.log(_version && _version !== result, '执行还是不执行')
          if (_version && _version !== result) {
            // console.log('执行版本更新')
            reload(result)

          } else {
            // 存储storage 
            wx.setStorage({
              data: result || 1,
              key: "_version"
            })
          }
        }
      } catch (error) {

      }
    }
    get_Version()
  },
  //  获取设备信息 
  DeviceInfo: function () {
    let App = this;
    App.DeviceInfoMenuButton(function (menuButtonObject) {

      wx.getSystemInfo({
        success: res => {
          //  
          //  导航栏信息 调用 
          /**
           * 是否为 x 以上的机型 
           * x 以上的机型 会出现小白条  
           * @param { screenHeight } `屏幕高度 `
           * @param {  safeArea.bottom } ` 安全区域右下角纵坐标`
           * BOTTOM_DISTANCE = screenHeight - safeArea.bottom
           *
           */
          let {
            screenHeight,
            safeArea: {
              bottom,
              top
            }
          } = res;
          App.globalData.BOTTOM_DISTANCE = (screenHeight - bottom) / 2;
          //  底部没有 小白条  顶部 没有刘海屏 
          if (App.globalData) {
            App.globalData.TOP_DISTANCE = screenHeight - bottom;
          }
          /**
           * 
           */
          let statusBarHeight = res.statusBarHeight, //状态栏高度
            navHeight = menuButtonObject.bottom + 8;
          App.globalData.statusBarHeight = statusBarHeight;
          App.globalData.navHeight = navHeight;
          App.globalData.btnHeight = menuButtonObject.height;
          App.globalData.btnWidth = menuButtonObject.width;
          App.globalData.btnRight = menuButtonObject.right;
          App.globalData.btnLeft = menuButtonObject.left;
          App.globalData.navTop = menuButtonObject.top;

          App.globalData.windowHeight = res.windowHeight;
          App.globalData.windowWidth = res.windowWidth;

        },
        fail(err) {
          //  (err);
        }
      })
    })

  },
  // 获取导航栏信息 
  DeviceInfoMenuButton: function (callback) {
    let App = this;
    /**
     * wx.getMenuButtonBoundingClientRect() 获取导航栏信息 
     */
    let menuButtonObject = wx.getMenuButtonBoundingClientRect();
    /**
     * 判断对象是否 为空 
     */
    if (menuButtonObject && menuButtonObject.top) {

      /**
       *  
       */
      callback && callback(menuButtonObject)
    } else {
      /**
       * 如果获取不到 导航栏高度 则再次调用 等待 0.3s
       */
      setTimeout(function () {
        App.DeviceInfoMenuButton(callback)
      }, 300)
    }
  },
  //清理缓存
  clearSystemStore(type = "c") {
    /**
     * @param type  `string`  指定清除的类型 
     * 
     */
    // 清除缓存 
    const config = wx.getStorageSync(type) || {};
    // console.log(config, '存储的信息')
    //  循环遍历执行的key
    for (let i in config) {
      try {
        //  移除key 
        wx.removeStorageSync(i)
        //  删除 对象中的value
        delete config[i]
      } catch (e) {
        // Do something when catch error
        return Promise.reject(e)
      }
    }
    //  清除完缓存再 存储一遍
    // 
    // console.log(type, config)
    wx.setStorage({
      key: type,
      data: config
    })
    //  指定成功的回调
    return Promise.resolve()

  },
  //隐私状态存储
  getPrivacySetting: function () {
    let App = this;
    wx.getPrivacySetting({
      success: res => {
        App.globalData.Privacy = res.needAuthorization;
        App.globalData.PrivacyName = res.privacyContractName;
      }
    })
  },
  //预览图片
  previewImage: function (current, urls) {
    wx.previewImage({
      current: current,
      urls: urls,
    })
  },
  //打开地图
  openLocation: function (data) {
    wx.openLocation({
      latitude: parseFloat(data.latitude),
      longitude: parseFloat(data.longitude),
      scale: data.scale ? data.scale : 18,
      name: data.name ? data.name : '',
      address: data.address ? data.address : '',
      fail(e) {
        console.log(e)
      }
    })
  },
  //获取用户授权信息
  getSetting: function () {
    wx.getSetting({
      withSubscriptions: true,
      success(res) {
        wx.setStorageSync('auth', { authSetting: res.authSetting, subscriptionsSetting: res.subscriptionsSetting })
      }
    })
  },
  //跳转搜索页
  search: function () {
    wx.navigateTo({
      url: '/pages/search/index/index'
    })
  },
  //加算
  accAdd(arg1, arg2) {
    let r1, r2, m;
    try {
      r1 = arg1.toString().split(".")[1].length
    } catch (e) {
      r1 = 0
    }
    try {
      r2 = arg2.toString().split(".")[1].length
    } catch (e) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m
  },
  //减算
  accSub(arg1, arg2) {
    if (isNaN(arg1)) {
      arg1 = 0;
    }
    if (isNaN(arg2)) {
      arg2 = 0;
    }
    arg1 = Number(arg1);
    arg2 = Number(arg2);

    var r1, r2, m, n;
    try {
      r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
    // n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(2);
  },
  //打电话
  makePhoneCall(phone) {
    wx.makePhoneCall({
      phoneNumber: phone
    })
  }
})